﻿//------------------------------------------------------------------------------------------------------
// The MIT License (MIT) Copyright (c) 2014 Marton Rusko
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
// associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial 
// portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//------------------------------------------------------------------------------------------------------
using System;
using System.Collections;

namespace RM.Banking.Unicredit.Statements
{
    /// <summary>
    /// Unicredit statmenet record for header records
    /// </summary>
    public class UnicreditStatementHeaderRecord : UnicreditStatementRecord
    {
        #region Private fields

        //HACK: Fields initialized with reflection
#pragma warning disable 649
        
        /// <summary>
        /// A fiók kódja
        /// </summary>
        [UnicreditRowMapping(2, 4)]
        private string fiokKod;

        /// <summary>
        /// Számlaszám
        /// </summary>
        [UnicreditRowMapping(6, 24)]
        private string szamlaszam;

        /// <summary>
        /// Kivonat dátuma (YYYYMMDD alakban)
        /// </summary>
        [UnicreditRowMapping(30, 8)]
        private string kivonatDatum;

        /// <summary>
        /// A kivonat száma
        /// </summary>
        [UnicreditRowMapping(38, 4)]
        private string kivonatSzama;

        /// <summary>
        /// Az ügyfél titulusa
        /// </summary>
        [UnicreditRowMapping(42, 25)]
        private string ugyfelTitulus;

        /// <summary>
        /// Az ügyfél neve
        /// </summary>
        [UnicreditRowMapping(67, 50)]
        private string ugyfelNev;

        /// <summary>
        /// Az ügyfél címe 1
        /// </summary>
        [UnicreditRowMapping(117, 40)]
        private string ugyfelCim1;

        /// <summary>
        /// Az ügyfél címe 2
        /// </summary>
        [UnicreditRowMapping(157, 40)]
        private string ugyfelCim2;

        /// <summary>
        /// Az ügyfél címe 3
        /// </summary>
        [UnicreditRowMapping(197, 30)]
        private string ugyfelCim3;

        /// <summary>
        /// Az ügyfél címe 4
        /// </summary>
        [UnicreditRowMapping(227, 30)]
        private string ugyfelCim4;

        /// <summary>
        /// A számla devizaneme
        /// </summary>
        [UnicreditRowMapping(257, 3)]
        private string szamlaDevizaneme;

        /// <summary>
        /// Előző kivonat dátuma (YYYYMMDD alakban)
        /// </summary>
        [UnicreditRowMapping(260, 8)]
        private string elozoKivonatDatuma;

        /// <summary>
        /// Nyitóegyenleg előjele
        /// </summary>
        [UnicreditRowMapping(268, 1)]
        private string nyitoegyenlegElojel;

        /// <summary>
        /// Nyitóegyenleg
        /// </summary>
        [UnicreditRowMapping(269, 15)]
        private string nyitoegyenleg;

        /// <summary>
        /// Záróegyenleg előjele
        /// </summary>
        [UnicreditRowMapping(284, 1)]
        private string zaroegyenlegElojel;

        /// <summary>
        /// Záróegyenleg
        /// </summary>
        [UnicreditRowMapping(285, 15)]
        private string zaroegyenleg;

        /// <summary>
        /// Összes Jóváírás
        /// </summary>
        [UnicreditRowMapping(300, 15)]
        private string osszesJovairas;

        /// <summary>
        /// Összes Terhelés
        /// </summary>
        [UnicreditRowMapping(315, 15)]
        private string osszesTerheles;

        /// <summary>
        /// Záróegyenleg - EUR-ban mező előjele
        /// </summary>
        [UnicreditRowMapping(330, 1)]
        private string zaroegyenlegEurElojel;

        /// <summary>
        /// Záróegyenleg - EUR-ban kifejezve
        /// </summary>
        [UnicreditRowMapping(331, 15)]
        private string zaroegyenlegEur;

        /// <summary>
        /// A fejrekordhoz tartozó tételek száma
        /// </summary>
        [UnicreditRowMapping(346, 7)]
        private string fejrekordhozTartozoTetelekSzama;

        #endregion

        #region Public properties

        /// <summary>
        /// A fiók kódja
        /// </summary>
        public string FiokKod { get; private set; }

        /// <summary>
        /// Számlaszám
        /// </summary>
        public string Szamlaszam { get; private set; }

        /// <summary>
        /// Kivonat dátuma (YYYYMMDD alakban)
        /// </summary>
        public DateTime KivonatDatum { get; private set; }

        /// <summary>
        /// A kivonat száma
        /// </summary>
        public int KivonatSzama { get; private set; }

        /// <summary>
        /// Az ügyfél titulusa
        /// </summary>
        public string UgyfelTitulus { get; private set; }

        /// <summary>
        /// Az ügyfél neve
        /// </summary>
        public string UgyfelNev { get; private set; }

        /// <summary>
        /// Az ügyfél címe 1
        /// </summary>
        public string UgyfelCim1 { get; private set; }

        /// <summary>
        /// Az ügyfél címe 2
        /// </summary>
        public string UgyfelCim2 { get; private set; }

        /// <summary>
        /// Az ügyfél címe 3
        /// </summary>
        public string UgyfelCim3 { get; private set; }

        /// <summary>
        /// Az ügyfél címe 4
        /// </summary>
        public string UgyfelCim4 { get; private set; }

        /// <summary>
        /// A számla devizaneme
        /// </summary>
        public string SzamlaDevizaneme { get; private set; }

        /// <summary>
        /// Előző kivonat dátuma (YYYYMMDD alakban)
        /// </summary>
        public DateTime ElozoKivonatDatuma { get; private set; }

        /// <summary>
        /// Nyitóegyenleg előjele
        /// </summary>
        public string NyitoegyenlegElojel { get; private set; }

        /// <summary>
        /// Nyitóegyenleg
        /// </summary>
        public double Nyitoegyenleg { get; private set; }

        /// <summary>
        /// Záróegyenleg előjele
        /// </summary>
        public string ZaroegyenlegElojel { get; private set; }

        /// <summary>
        /// Záróegyenleg
        /// </summary>
        public double Zaroegyenleg { get; private set; }

        /// <summary>
        /// Összes Jóváírás
        /// </summary>
        public double OsszesJovairas { get; private set; }

        /// <summary>
        /// Összes Terhelés
        /// </summary>
        public double OsszesTerheles { get; private set; }

        /// <summary>
        /// Záróegyenleg - EUR-ban mező előjele
        /// </summary>
        public string ZaroegyenlegEurElojel { get; private set; }

        /// <summary>
        /// Záróegyenleg - EUR-ban kifejezve
        /// </summary>
        public double ZaroegyenlegEur { get; private set; }

        /// <summary>
        /// A fejrekordhoz tartozó tételek száma
        /// </summary>
        public int FejrekordhozTartozoTetelekSzama { get; private set; }

        #endregion

        public UnicreditStatementHeaderRecord(string line)
            : base(line)
        {
            FiokKod = fiokKod;
            Szamlaszam = szamlaszam;
            KivonatDatum = ParseDate(kivonatDatum);
            KivonatSzama = int.Parse(kivonatSzama);
            UgyfelTitulus = ugyfelTitulus;
            UgyfelNev = ugyfelNev;
            UgyfelCim1 = ugyfelCim1;
            UgyfelCim2 = ugyfelCim2;
            UgyfelCim3 = ugyfelCim3;
            UgyfelCim4 = ugyfelCim4;
            SzamlaDevizaneme = szamlaDevizaneme;
            ElozoKivonatDatuma = ParseDate(elozoKivonatDatuma);
            NyitoegyenlegElojel = nyitoegyenlegElojel;
            Nyitoegyenleg = ParseAmount(nyitoegyenleg, nyitoegyenlegElojel);
            ZaroegyenlegElojel = zaroegyenlegElojel;
            Zaroegyenleg = ParseAmount(zaroegyenleg, zaroegyenlegElojel);
            OsszesJovairas = ParseAmount(osszesJovairas);
            OsszesTerheles = ParseAmount(osszesTerheles);
            ZaroegyenlegEurElojel = zaroegyenlegElojel;
            ZaroegyenlegEur = ParseAmount(zaroegyenlegEur, zaroegyenlegEurElojel);
            FejrekordhozTartozoTetelekSzama = int.Parse(fejrekordhozTartozoTetelekSzama);
        }

    }
}